var AIRTIME = (function (AIRTIME) {
  var mod;

  if (AIRTIME.history === undefined) {
    AIRTIME.history = {};
  }
  mod = AIRTIME.history;

  var $historyContentDiv;

  var lengthMenu = [
    [10, 25, 50, 100, 500, -1],
    [10, 25, 50, 100, 500, $.i18n._("All")],
  ];

  var sDom = 'l<"dt-process-rel"r><"H"><"dataTables_scrolling"t><"F"ip>';

  var selectedLogItems = {};

  var dateStartId = "#his_date_start",
    timeStartId = "#his_time_start",
    dateEndId = "#his_date_end",
    timeEndId = "#his_time_end",
    oTableAgg,
    oTableItem,
    oTableShow,
    inShowsTab = false;

  function validateTimeRange() {
    var oRange,
      inputs = $(".his-timerange > input"),
      start,
      end;

    oRange = AIRTIME.utilities.fnGetScheduleRange(
      dateStartId,
      timeStartId,
      dateEndId,
      timeEndId,
    );

    start = oRange.start;
    end = oRange.end;

    if (end >= start) {
      inputs.removeClass("error");
    } else {
      inputs.addClass("error");
    }

    return {
      start: start,
      end: end,
      isValid: end >= start,
    };
  }

  function getSelectedLogItems() {
    var items = Object.keys(selectedLogItems);

    return items;
  }

  function addSelectedLogItem($el) {
    var id;

    $el.addClass("his-selected");
    id = $el.data("his-id");
    selectedLogItems[id] = "";
  }

  function removeSelectedLogItem($el) {
    var id;

    $el.removeClass("his-selected");
    id = $el.data("his-id");
    delete selectedLogItems[id];
  }

  function emptySelectedLogItems() {
    var $inputs = $historyContentDiv.find(".his_checkbox").find("input");

    $inputs.prop("checked", false);
    $inputs.parents("tr").removeClass("his-selected");

    selectedLogItems = {};
  }

  function selectCurrentPage(e) {
    var $ctx = $(e.currentTarget).parents("div.dataTables_wrapper"),
      $inputs = $ctx.find(".his_checkbox").find("input"),
      $tr,
      $input;

    $.each($inputs, function (index, input) {
      $input = $(input);
      $input.prop("checked", true);
      $tr = $input.parents("tr");
      addSelectedLogItem($tr);
    });
  }

  function deselectCurrentPage(e) {
    var $ctx = $(e.currentTarget).parents("div.dataTables_wrapper"),
      $inputs = $ctx.find(".his_checkbox").find("input"),
      $tr,
      $input;

    $.each($inputs, function (index, input) {
      $input = $(input);
      $input.prop("checked", false);
      $tr = $input.parents("tr");
      removeSelectedLogItem($tr);
    });
  }

  function getFileName(ext) {
    var filename =
      $("#his_date_start").val() +
      "_" +
      $("#his_time_start").val() +
      "m--" +
      $("#his_date_end").val() +
      "_" +
      $("#his_time_end").val() +
      "m";
    filename = filename.replace(/:/g, "h");

    if (ext == "pdf") {
      filename = filename + ".pdf";
    } else {
      filename = filename + ".csv";
    }
    return filename;
  }

  /* This callback can be used for all history tables */
  function fnServerData(sSource, aoData, fnCallback) {
    if (fnServerData.hasOwnProperty("start")) {
      aoData.push({ name: "start", value: fnServerData.start });
    }
    if (fnServerData.hasOwnProperty("end")) {
      aoData.push({ name: "end", value: fnServerData.end });
    }
    if (fnServerData.hasOwnProperty("instance")) {
      aoData.push({ name: "instance_id", value: fnServerData.instance });
    }

    aoData.push({ name: "format", value: "json" });

    $.ajax({
      dataType: "json",
      type: "GET",
      url: sSource,
      data: aoData,
      success: fnCallback,
    });
  }

  function createShowAccordSection(config) {
    var template, $el;

    template =
      "<h3>" +
      "<a href='#'>" +
      "<span class='show-title'><%= name %></span>" +
      "<span class='push-right'>" +
      "<span class='show-date'><%= date %></span>" +
      "<span class='show-time'><%= startTime %></span>" +
      "-" +
      "<span class='show-time'><%= endTime %></span>" +
      "</span>" +
      "</a>" +
      "</h3>" +
      "<div " +
      "data-instance='<%= instance %>' " +
      "></div>";

    template = _.template(template);
    $el = $(template(config));

    return $el;
  }

  //$el is the div in the accordian we should create the table on.
  function createShowTable($el) {
    var instance = $el.data("instance");
    var $table = $("<table/>", {
      cellpadding: "0",
      cellspacing: "0",
      class: "datatable",
      id: "history_table_show",
    });

    //assign the retrieval function the show instance id.
    fnServerData.instance = instance;
    $el.append($table);
    $el.css("height", "auto");
    oTableShow = itemHistoryTable("history_table_show");
  }

  function drawShowList(oShows) {
    var $showList = $historyContentDiv.find("#history_show_summary"),
      i,
      len,
      $accordSection,
      show,
      tmp;

    $showList.accordion("destroy").empty();

    for (i = 0, len = oShows.length; i < len; i++) {
      show = oShows[i];
      tmp = show.starts.split(" ");

      $accordSection = createShowAccordSection({
        instance: show.instance_id,
        name: show.name,
        date: tmp[0],
        startTime: tmp[1],
        endTime: show.ends.split(" ").pop(),
      });

      $showList.append($accordSection);
    }

    $showList.accordion({
      animated: false,
      create: function (event, ui) {
        var $div = $showList.find(".ui-accordion-content-active");
        console.log(event);
        //$div.css()
        createShowTable($div);
      },
      change: function (event, ui) {
        var $div = $(ui.newContent);
        $(ui.oldContent).empty();
        createShowTable($div);
        selectedLogItems = {};
      },
      //changestart: function( event, ui ) {}
    });
  }

  function createToolbarButtons($el) {
    var $menu = $("<div class='btn-toolbar' />");

    $menu.append(
      "<div class='btn-group'>" +
        "<button class='btn btn-small btn-new' id='his_create'>" +
        "<i class='icon-white icon-plus'></i>" +
        $.i18n._("New Log Entry") +
        "</button>" +
        "</div>",
    );

    $menu.append(
      "<div class='btn-group'>" +
        "<button class='btn btn-small dropdown-toggle' data-toggle='dropdown'>" +
        $.i18n._("Select") +
        " <span class='caret'></span>" +
        "</button>" +
        "<ul class='dropdown-menu'>" +
        "<li class='his-select-page'><a href='#'>" +
        $.i18n._("Select this page") +
        "</a></li>" +
        "<li class='his-dselect-page'><a href='#'>" +
        $.i18n._("Deselect this page") +
        "</a></li>" +
        "<li class='his-dselect-all'><a href='#'>" +
        $.i18n._("Deselect all") +
        "</a></li>" +
        "</ul>" +
        "</div>",
    );

    $menu.append(
      "<div class='btn-group'>" +
        "<button class='btn btn-small dropdown-toggle' data-toggle='dropdown'>" +
        $.i18n._("Export") +
        " <span class='caret'></span>" +
        "</button>" +
        "<ul class='dropdown-menu'>" +
        "<li id='csv_export'><a href='#'>" +
        $.i18n._("Export as CSV") +
        "</a></li>" +
        "<li id='pdf_export'><a href='#'>" +
        $.i18n._("Export as PDF") +
        "</a></li>" +
        "</ul>" +
        "</div>",
    );

    $menu.append(
      "<div class='btn-group'>" +
        "<button class='btn btn-small' id='his_trash'>" +
        "<i class='icon-white icon-trash'></i>" +
        "</button>" +
        "</div>",
    );

    $el.append($menu);
  }

  function aggregateHistoryTable() {
    var oTable,
      $historyTableDiv = $historyContentDiv.find("#history_table_aggregate"),
      columns,
      fnRowCallback;

    fnRowCallback = function (nRow, aData, iDisplayIndex, iDisplayIndexFull) {
      var editUrl =
          baseUrl + "playouthistory/edit-file-item/id/" + aData.file_id,
        $nRow = $(nRow);

      $nRow.data("url-edit", editUrl);
    };

    columns = JSON.parse(
      localStorage.getItem("datatables-historyfile-aoColumns"),
    );

    oTable = $historyTableDiv.dataTable({
      aoColumns: columns,

      bProcessing: true,
      bServerSide: true,
      sAjaxSource: baseUrl + "playouthistory/file-history-feed",
      sAjaxDataProp: "history",
      fnServerData: fnServerData,
      fnRowCallback: fnRowCallback,
      oLanguage: getDatatablesStrings({
        sEmptyTable: $.i18n._(
          "No tracks were played during the selected time period.",
        ),
        sInfoEmpty: $.i18n._("Showing 0 to 0 of 0 tracks"),
        sInfo: $.i18n._("Showing _START_ to _END_ of _TOTAL_ tracks"),
        sInfoEmpty: $.i18n._("Showing 0 to 0 of 0 tracks"),
        sInfoFiltered: $.i18n._("(filtered from _MAX_ total tracks)"),
      }),
      aLengthMenu: lengthMenu,
      iDisplayLength: 25,
      sPaginationType: "full_numbers",
      bJQueryUI: true,
      bAutoWidth: true,
      sDom: sDom,
    });
    oTable.fnSetFilteringDelay(350);

    return oTable;
  }

  function itemHistoryTable(id) {
    var oTable,
      $historyTableDiv = $historyContentDiv.find("#" + id),
      $toolbar,
      columns,
      fnRowCallback,
      booleans = {},
      i,
      c;

    columns = JSON.parse(
      localStorage.getItem("datatables-historyitem-aoColumns"),
    );

    for (i in columns) {
      c = columns[i];
      if (c["sDataType"] === "boolean") {
        booleans[c["mDataProp"]] = c["sTitle"];
      }
    }

    fnRowCallback = function (nRow, aData, iDisplayIndex, iDisplayIndexFull) {
      var editUrl =
          baseUrl + "playouthistory/edit-list-item/id/" + aData.history_id,
        deleteUrl =
          baseUrl + "playouthistory/delete-list-item/id/" + aData.history_id,
        emptyCheckBox = String.fromCharCode(parseInt(2610, 16)),
        checkedCheckBox = String.fromCharCode(parseInt(2612, 16)),
        b,
        text,
        $nRow = $(nRow);

      // add checkbox
      $nRow
        .find("td.his_checkbox")
        .html("<input type='checkbox' name='cb_" + aData.history_id + "'>");

      $nRow.data("his-id", aData.history_id);
      $nRow.data("url-edit", editUrl);
      $nRow.data("url-delete", deleteUrl);

      for (b in booleans) {
        text = aData[b] ? checkedCheckBox : emptyCheckBox;
        text = text + " " + booleans[b];

        $nRow.find(".his_" + b).html(text);
      }
    };

    oTable = $historyTableDiv.dataTable({
      aoColumns: columns,
      bProcessing: true,
      bServerSide: true,
      sAjaxSource: baseUrl + "playouthistory/item-history-feed",
      sAjaxDataProp: "history",
      fnServerData: fnServerData,
      fnRowCallback: fnRowCallback,
      oLanguage: getDatatablesStrings({
        sEmptyTable: $.i18n._(
          "No tracks were played during the selected time period.",
        ),
        sInfoEmpty: $.i18n._("Showing 0 to 0 of 0 tracks"),
        sInfo: $.i18n._("Showing _START_ to _END_ of _TOTAL_ tracks"),
        sInfoEmpty: $.i18n._("Showing 0 to 0 of 0 tracks"),
        sInfoFiltered: $.i18n._("(filtered from _MAX_ total tracks)"),
      }),
      aLengthMenu: lengthMenu,
      iDisplayLength: 25,
      sPaginationType: "full_numbers",
      bJQueryUI: true,
      bAutoWidth: true,
      sDom: sDom,
    });
    oTable.fnSetFilteringDelay(350);

    $toolbar = $historyTableDiv
      .parents(".dataTables_wrapper")
      .find(".fg-toolbar:first");
    createToolbarButtons($toolbar);

    return oTable;
  }

  function showSummaryList(start, end) {
    var url = baseUrl + "playouthistory/show-history-feed",
      data = {
        format: "json",
        start: start,
        end: end,
      };

    $.post(url, data, function (json) {
      drawShowList(json);
    });
  }

  mod.onReady = function () {
    var oBaseDatePickerSettings,
      oBaseTimePickerSettings,
      $hisDialogEl,
      tabsInit = [
        {
          initialized: false,
          initialize: function () {
            oTableItem = itemHistoryTable("history_table_list");
          },
          navigate: function () {
            delete fnServerData.instance;
            oTableItem.fnDraw();
          },
          always: function () {
            inShowsTab = false;
            emptySelectedLogItems();
          },
        },
        {
          initialized: false,
          initialize: function () {
            oTableAgg = aggregateHistoryTable();
          },
          navigate: function () {
            delete fnServerData.instance;
            oTableAgg.fnDraw();
          },
          always: function () {
            inShowsTab = false;
            emptySelectedLogItems();
          },
        },
        {
          initialized: false,
          initialize: function () {},
          navigate: function () {},
          always: function () {
            inShowsTab = true;

            var info = getStartEnd();
            showSummaryList(info.start, info.end);
            emptySelectedLogItems();
          },
        },
      ];

    //set the locale names for the bootstrap calendar.
    $.fn.datetimepicker.dates = {
      daysMin: i18n_days_short,
      months: i18n_months,
      monthsShort: i18n_months_short,
    };

    $historyContentDiv = $("#history_content");

    function redrawTables() {
      oTableAgg && oTableAgg.fnDraw();
      oTableItem && oTableItem.fnDraw();
      oTableShow && oTableShow.fnDraw();
    }

    function removeHistoryDialog() {
      $hisDialogEl.dialog("destroy");
      $hisDialogEl.remove();
    }

    function initializeDialog() {
      var $startPicker = $hisDialogEl.find("#his_item_starts_datetimepicker"),
        $endPicker = $hisDialogEl.find("#his_item_ends_datetimepicker");

      $startPicker.datetimepicker();

      $endPicker.datetimepicker({
        showTimeFirst: true,
      });

      $startPicker.on("changeDate", function (e) {
        $endPicker.data("datetimepicker").setLocalDate(e.localDate);
      });
    }

    function processDialogHtml($el) {
      if (inShowsTab) {
        $el.find("#his_choose_instance").remove();
      }

      return $el;
    }

    function makeHistoryDialog(html) {
      $hisDialogEl = $(html);
      $hisDialogEl = processDialogHtml($hisDialogEl);

      $hisDialogEl.dialog({
        title: $.i18n._("Edit History Record"),
        modal: false,
        open: function (event, ui) {
          initializeDialog();
        },
        close: function () {
          removeHistoryDialog();
        },
      });
    }

    hisSubmit(); // Fixes display bug

    /*
     * Icon hover states for search.
     */
    $historyContentDiv.on(
      "mouseenter",
      ".his-timerange .ui-button",
      function (ev) {
        $(this).addClass("ui-state-hover");
      },
    );
    $historyContentDiv.on(
      "mouseleave",
      ".his-timerange .ui-button",
      function (ev) {
        $(this).removeClass("ui-state-hover");
      },
    );

    oBaseDatePickerSettings = {
      dateFormat: "yy-mm-dd",
      //i18n_months, i18n_days_short are in common.js
      monthNames: i18n_months,
      dayNamesMin: i18n_days_short,
      onSelect: function (sDate, oDatePicker) {
        $(this).datepicker("setDate", sDate);
      },
      onClose: validateTimeRange,
    };

    oBaseTimePickerSettings = {
      showPeriodLabels: false,
      showCloseButton: true,
      closeButtonText: $.i18n._("Done"),
      showLeadingZero: false,
      defaultTime: "0:00",
      hourText: $.i18n._("Hour"),
      minuteText: $.i18n._("Minute"),
      onClose: validateTimeRange,
    };

    $historyContentDiv
      .find(dateStartId)
      .datepicker(oBaseDatePickerSettings)
      .blur(validateTimeRange);

    $historyContentDiv
      .find(timeStartId)
      .timepicker(oBaseTimePickerSettings)
      .blur(validateTimeRange);

    $historyContentDiv
      .find(dateEndId)
      .datepicker(oBaseDatePickerSettings)
      .blur(validateTimeRange);

    $historyContentDiv
      .find(timeEndId)
      .timepicker(oBaseTimePickerSettings)
      .blur(validateTimeRange);

    $historyContentDiv.on("click", "#his_create", function (e) {
      var url = baseUrl + "playouthistory/edit-list-item/format/json";

      e.preventDefault();

      $.get(
        url,
        function (json) {
          makeHistoryDialog(json.dialog);
        },
        "json",
      );
    });

    $historyContentDiv.on("click", "#pdf_export", async function () {
      // Get date/time from pickers
      var startDay = document.querySelector("#his_date_start").value;
      var startTime = document.querySelector("#his_time_start").value;
      var endDay = document.querySelector("#his_date_end").value;
      var endTime = document.querySelector("#his_time_end").value;

      var url =
        baseUrl +
        "api/item-history-feed?start=" +
        startDay +
        " " +
        startTime +
        "&end=" +
        endDay +
        " " +
        endTime;
      var requestData = await fetch(url);
      var hisData = await requestData.json();

      if (!hisData.length) {
        alert("The date range selected doesn't have any items to export.");
        return;
      } else {
        // Generate PDF template
        var dd = {
          content: [
            { text: "Libretime", style: "subheader" },
            {
              text:
                "Playout History from " +
                startDay +
                " " +
                startTime +
                " to " +
                endDay +
                " " +
                endTime,
              style: "header",
            },
            {
              style: "mainTable",
              table: {
                headerRows: 1,
                body: [
                  [
                    { text: "Start Time", style: "tableHeader" },
                    { text: "End Time", style: "tableHeader" },
                    { text: "Song", style: "tableHeader" },
                    { text: "Artist", style: "tableHeader" },
                  ],
                ],
              },
            },
          ],
          styles: {
            header: {
              fontSize: 18,
              bold: true,
              margin: [0, 0, 0, 10],
            },
            subheader: {
              fontSize: 14,
              bold: true,
              margin: [0, 10, 0, 5],
            },
            mainTable: {
              margin: [0, 5, 0, 15],
            },
            tableHeader: {
              bold: true,
              fontSize: 13,
              color: "black",
            },
          },
          defaultStyle: {},
        };
        hisData.forEach((element) => {
          // Removing extra fields
          delete element.checkbox;
          delete element.history_id;
          delete element.instance_id;
          dd.content[2].table.body.push(Object.values(element));
        });
        // Make PDF and start download
        pdfMake.createPdf(dd).download();
      }
    });

    $historyContentDiv.on("click", "#csv_export", async function () {
      // Get date/time from pickers
      var startDay = document.querySelector("#his_date_start").value;
      var startTime = document.querySelector("#his_time_start").value;
      var endDay = document.querySelector("#his_date_end").value;
      var endTime = document.querySelector("#his_time_end").value;

      var url =
        baseUrl +
        "api/item-history-feed?start=" +
        startDay +
        " " +
        startTime +
        "&end=" +
        endDay +
        " " +
        endTime;
      var requestData = await fetch(url);
      var hisData = await requestData.json();

      if (!hisData.length) {
        alert("The date range selected doesn't have any items to export.");
        return;
      } else {
        // Clean returned data
        hisData.forEach((element) => {
          // Start date/time
          element.startDate = element.starts.split(" ")[0];
          element.startTime = element.starts.split(" ")[1];
          // End date/time
          element.endDate = element.ends.split(" ")[0];
          element.endTime = element.ends.split(" ")[1];
          // Moving Title and Artist fields to the end
          element.title = element.track_title;
          element.artist = element.artist_name;
          // Removing extra fields
          delete element.checkbox;
          delete element.history_id;
          delete element.instance_id;
          delete element.starts; // we already converted these, so we don't need them anymore
          delete element.ends;
          delete element.track_title;
          delete element.artist_name;
        });
      }

      var csvX = new CSVExport(hisData); // Actual export function
      return false; // Was part of the demo. Please leave as is.
    });

    $("body").on("click", ".his_file_cancel, .his_item_cancel", function (e) {
      removeHistoryDialog();
    });

    $("body").on("click", ".his_file_save", function (e) {
      e.preventDefault();

      var $form = $(this).parents("form");
      var data = $form.serializeArray();

      var url = baseUrl + "Playouthistory/update-file-item/format/json";

      $.post(
        url,
        data,
        function (json) {
          //TODO put errors on form.
          if (json.error !== undefined) {
            //makeHistoryDialog(json.dialog);
          } else {
            removeHistoryDialog();
            redrawTables();
          }
        },
        "json",
      );
    });

    $("body").on("click", ".his_item_save", function (e) {
      e.preventDefault();

      var $form = $(this).parents("form"),
        data = $form.serializeArray(),
        id = data[0].value,
        createUrl = baseUrl + "Playouthistory/create-list-item/format/json",
        updateUrl = baseUrl + "Playouthistory/update-list-item/format/json",
        url,
        $select = $hisDialogEl.find("#his_instance_select"),
        instance;

      url = id === "" ? createUrl : updateUrl;

      if (fnServerData.instance !== undefined) {
        data.push({
          name: "instance_id",
          value: fnServerData.instance,
        });
      } else if ($select.length > 0) {
        instance = $select.val();

        if (instance > 0) {
          data.push({
            name: "instance_id",
            value: instance,
          });
        }
      }

      $.post(
        url,
        data,
        function (json) {
          if (json.form !== undefined) {
            var $newForm = $(json.form);
            $newForm = processDialogHtml($newForm);
            $hisDialogEl.html($newForm.html());
            initializeDialog();
          } else {
            removeHistoryDialog();
            redrawTables();
          }
        },
        "json",
      );
    });

    $historyContentDiv.on("click", ".his_checkbox input", function (e) {
      var checked = e.currentTarget.checked,
        $tr = $(e.currentTarget).parents("tr");

      if (checked) {
        addSelectedLogItem($tr);
      } else {
        removeSelectedLogItem($tr);
      }
    });

    $("body").on("click", "#his_instance_retrieve", function (e) {
      var startPicker = $hisDialogEl.find("#his_item_starts"),
        endPicker = $hisDialogEl.find("#his_item_ends"),
        url = baseUrl + "playouthistory/show-history-feed",
        startDate = startPicker.val(),
        endDate = endPicker.val(),
        data;

      data = {
        start: startDate,
        end: endDate,
        format: "json",
      };

      $.get(url, data, function (json) {
        var i,
          $select = $("<select/>", {
            id: "his_instance_select",
          }),
          $option,
          show;

        if (json.length > 0) {
          for (i = 0; i < json.length; i++) {
            show = json[i];

            $option = $("<option/>")
              .text(show.name)
              .attr("value", show.instance_id);

            $select.append($option);
          }
        }

        $option = $("<option/>").text($.i18n._("No Show")).attr("value", 0);

        $select.append($option);

        $hisDialogEl.find("#his_instance_select").replaceWith($select);
      });
    });

    function getStartEnd() {
      return AIRTIME.utilities.fnGetScheduleRange(
        dateStartId,
        timeStartId,
        dateEndId,
        timeEndId,
      );
    }

    function hisSubmit() {
      var fn, info;

      info = getStartEnd();

      fn = fnServerData;
      fn.start = info.start;
      fn.end = info.end;

      if (inShowsTab) {
        showSummaryList(info.start, info.end);
      } else {
        redrawTables();
      }
    }

    $historyContentDiv.find("#his_submit").click(function (ev) {
      hisSubmit();
    });

    $historyContentDiv.on("click", ".his-select-page", selectCurrentPage);
    $historyContentDiv.on("click", ".his-dselect-page", deselectCurrentPage);
    $historyContentDiv.on("click", ".his-dselect-all", emptySelectedLogItems);

    $historyContentDiv.on("click", "#his_trash", function (ev) {
      var items = getSelectedLogItems(),
        url = baseUrl + "playouthistory/delete-list-items";

      $.post(url, { ids: items, format: "json" }, function () {
        selectedLogItems = {};
        redrawTables();
      });
    });

    $historyContentDiv.find("#his-tabs").tabs({
      show: function (event, ui) {
        var href = $(ui.tab).attr("href");
        var index = href.split("-").pop();
        var tab = tabsInit[index - 1];

        if (!tab.initialized) {
          tab.initialize();
          tab.initialized = true;
        } else {
          tab.navigate();
        }

        tab.always();
      },
    });

    // begin context menu initialization.
    $.contextMenu({
      selector: "#history_content td:not(.his_checkbox)",
      trigger: "left",
      ignoreRightClick: true,

      build: function ($el, e) {
        var items = {},
          callback,
          $tr,
          editUrl,
          deleteUrl;

        $tr = $el.parents("tr");
        editUrl = $tr.data("url-edit");
        deleteUrl = $tr.data("url-delete");

        if (editUrl !== undefined) {
          callback = function () {
            $.post(
              editUrl,
              { format: "json" },
              function (json) {
                makeHistoryDialog(json.dialog);
              },
              "json",
            );
          };

          items["edit"] = {
            name: $.i18n._("Edit"),
            icon: "edit",
            callback: callback,
          };
        }

        if (deleteUrl !== undefined) {
          callback = function () {
            var c = confirm("Delete this entry?");

            if (c) {
              $.post(deleteUrl, { format: "json" }, function (json) {
                redrawTables();
              });
            }
          };

          items["del"] = {
            name: $.i18n._("Delete"),
            icon: "delete",
            callback: callback,
          };
        }

        return {
          items: items,
        };
      },
    });
  };

  return AIRTIME;
})(AIRTIME || {});

$(document).ready(AIRTIME.history.onReady);
